

package Control;

import Model.Funcionario;
import Utilitaria.ConexaoBanco;
import Utilitaria.Util;
import View.limFuncionario;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JOptionPane;

public class ctrFuncionario {
    private Vector vetFuncionario;
    private ctrPrincipal controlPrincipal;
    private final ConexaoBanco objConexao;

    public ctrFuncionario(ctrPrincipal objCtrPrincipal, ConexaoBanco objConexao) throws SQLException {
        this.objConexao = objConexao;
        this.recuperaFuncionarios();
        controlPrincipal = objCtrPrincipal;
        limFuncionario limFuncionario = new limFuncionario(this);
    }
     public void cadastraFuncionario( String Nome, String CPF, String Email, String Tel_celular, String Tel_residencial,
            String Cargo, String End_rua, String End_bairro, String End_cep, String End_cidade) throws SQLException, Exception {

        int codFuncionario = this.ultimoCodigo() + 1;
        Funcionario obj = new Funcionario(codFuncionario, Nome, CPF, Cargo, Email, Tel_celular, Tel_residencial, End_rua, End_bairro, End_cep, End_cidade);
        this.executaInsert(obj);
        controlPrincipal.operacaoAnimal(codFuncionario, Util.CADASTRA);
        this.recuperaFuncionarios();

    }
      private void executaInsert(Funcionario obj) throws Exception {

        String sqlFuncionario = "insert into tbl_funcionario values (" +obj.getCodFuncionario()+
                ", '"+obj.getNome()+"', '"+obj.getCPF()+"', '"+obj.getEmail()+
                "', '"+obj.getTel_celular()+"', '"+obj.getTel_residencial()+"', '"+obj.getCargo()+
                "', '"+obj.getEnd_rua()+"', '"+obj.getEnd_bairro()+"', '"+obj.getEnd_cep()+"', '"+obj.getEnd_cidade()+"')";
        objConexao.statement.executeUpdate(sqlFuncionario);

    }

    public void alterarFuncionario(String codFuncionario, String Nome, String CPF, String Email, String Tel_celular, String Tel_residencial, String Cargo, String End_rua, String End_bairro, String End_cep, String End_cidade) throws Exception  {

        int index = 0;
        int aux = 0;
        int codBuscado = Integer.parseInt(codFuncionario);
        do {
            Funcionario obj = (Funcionario) vetFuncionario.elementAt(index);
            if(obj.getCodFuncionario() == codBuscado) {
                String sqlFuncionario ="UPDATE tbl_funcionario SET "+
                                "fun_nome = '"+ Nome +"', "+
                                "fun_cpf = '"+ CPF +"', "+
                                "fun_email = '"+ Email +"', "+
                                "fun_tcelular = '"+ Tel_celular +"', "+
                                "fun_tresidencial = '"+ Tel_residencial +"', "+
                                "fun_cargo = '"+ Cargo +"', "+
                                "fun_erua = '"+ End_rua +"', "+
                                "fun_ebairro = '"+ End_bairro +"', "+
                                "fun_ecep = '"+ End_cep +"', "+
                                "fun_ecidade = '"+ End_cidade +"' "+
                                "where fun_id = "+ codBuscado;
                if (objConexao.statement.executeUpdate(sqlFuncionario) == 1)
                    aux = 1;
                else
                    throw new Exception("");
            }
            index++;
        } while (aux == 0 && index <= vetFuncionario.size());
        this.recuperaFuncionarios();
        controlPrincipal.operacaoAnimal(codBuscado, Util.ALTERA);

    }

    public void excluir(String strCodFuncionario ) throws SQLException, Exception {

        Funcionario objBuscado = null;
        int codFuncionario = Integer.parseInt(strCodFuncionario);
        int index = 0;
        do{
            objBuscado = (Funcionario) vetFuncionario.elementAt(index);
            if(objBuscado.getCodFuncionario() == codFuncionario) {
                int opcao_escolhida = JOptionPane.showConfirmDialog(null,"Deseja excluir o cadastro de "
                        +objBuscado.getNome()+" ?", "Confirmação de exclusão", JOptionPane.YES_NO_OPTION);
                if (opcao_escolhida == JOptionPane.YES_OPTION){
                    int exclusao = objConexao.statement.executeUpdate("DELETE FROM tbl_funcionario Where cli_id = " + codFuncionario);
                    this.recuperaFuncionarios();
                    JOptionPane.showMessageDialog(null,"Exclusão realizada com sucesso.");
                }
                else
                    return;
            }
            index++;
        } while (index <= vetFuncionario.size());
        controlPrincipal.operacaoAnimal(codFuncionario, Util.LIMPA);
    }

    public ArrayList<String> pesquisa_digitacao(int tamanho_pesquisa, String strBuscada) throws Exception {

        String igual = "n";
        Funcionario objFuncionario = null;
        int index = 0;
        while(igual.equals("n") && index <= vetFuncionario.size()) {
            objFuncionario = (Funcionario)vetFuncionario.elementAt(index);
            String pesquisado= objFuncionario.getNome().substring(0, tamanho_pesquisa);
            if (pesquisado.equals(strBuscada))
                igual = "s";
            else
                index++;
        }
        if(igual.equals("s"))
            //controlPrincipal.operacaoAnimal(objCliente.getCodCliente, Util.PESQUISA);
            return montaResult(objFuncionario);
        else
            throw new Exception ("");

    }

    private void recuperaFuncionarios() throws SQLException {

        vetFuncionario = new Vector();
        objConexao.executeQuery("SELECT * FROM tbl_funcionario");
        Funcionario objFuncionario;
        while (objConexao.resultset.next()) {
            objFuncionario = new Funcionario (
                        Integer.parseInt(objConexao.resultset.getString("fun_id")),//Codigo cliente
                        objConexao.resultset.getString("fun_nome"), //Nome
                        objConexao.resultset.getString("fun_cpf"), //CPF
                        objConexao.resultset.getString("fun_email"), //Email
                        objConexao.resultset.getString("fun_tcelular"),//Tel celular
                        objConexao.resultset.getString("fun_tresidencial"),//Tel residencial
                        objConexao.resultset.getString("fun_cargo"),//Tel comercial
                        objConexao.resultset.getString("fun_erua"), //Rua
                        objConexao.resultset.getString("fun_ebairro"), //Bairro
                        objConexao.resultset.getString("fun_ecep"), //CEP
                        objConexao.resultset.getString("fun_ecidade")); //Cidade
            vetFuncionario.addElement(objFuncionario);
        }

    }

    public ArrayList<String> primeiroFuncionario () throws Exception {

        Funcionario firstElement = (Funcionario) vetFuncionario.firstElement();
        if(firstElement != null){
            controlPrincipal.operacaoAnimal(firstElement.getCodFuncionario(), Util.PESQUISA);
            return montaResult(firstElement);
        }
        else
            throw new Exception ();

    }

    public ArrayList<String> ultimoFuncionario () throws Exception {

        Funcionario lastElement = (Funcionario) vetFuncionario.lastElement();
        if(lastElement != null){
            controlPrincipal.operacaoAnimal(lastElement.getCodFuncionario(), Util.PESQUISA);
            return montaResult(lastElement);
        }
        else
            throw new Exception ();

    }

    public ArrayList<String> proximoFuncionario (String strCodAnterior) throws Exception {

        Funcionario objBuscado = null;
        int codAnterior = Integer.parseInt(strCodAnterior);
        int aux = 0, index = 0;
        do{
            Funcionario objAnterior = (Funcionario) vetFuncionario.elementAt(index);
            if(objAnterior.getCodFuncionario() == codAnterior) {
                objBuscado = (Funcionario)vetFuncionario.elementAt(index + 1);// index + 1 implica o objeto posterior no vetor
                aux = 1;
            }
            index++;
        } while (aux == 0 && index <= vetFuncionario.size());
        if (aux == 1) {
            controlPrincipal.operacaoAnimal(objBuscado.getCodFuncionario(), Util.PESQUISA);
            return montaResult(objBuscado);
        }
        else
            throw new Exception ("");

    }

   public ArrayList<String> anteriorFuncionario (String strCodSucessor) throws Exception {

        Funcionario objSucessor = null;
        Funcionario objBuscado = null;
        int codSucessor = Integer.parseInt(strCodSucessor);
        int aux = 0, index = 0;
        do{
            objSucessor = (Funcionario) vetFuncionario.elementAt(index);
            if(objSucessor.getCodFuncionario() == codSucessor && index == 0)
                index = -2; //recebe -2 para que no final do lop possa receber + 1 e sair do lop -> implica que o codigo passado para a função já é o codigo do primeiro registro
            if(objSucessor.getCodFuncionario() == codSucessor){
                objBuscado = (Funcionario)vetFuncionario.elementAt(index - 1);// index - 1 implica o objeto anterior no vetor
                aux = 1;
            }
            index++;
        } while (aux == 0 && index != -1);
        if (aux == 1) {
            controlPrincipal.operacaoAnimal(objBuscado.getCodFuncionario(), Util.PESQUISA);
            return montaResult(objBuscado);
        }
        else
            throw new Exception ("");

    }

    private ArrayList<String> montaResult (Funcionario obj){

        ArrayList<String> result = new ArrayList<String>();
        result.add(String.valueOf(obj.getCodFuncionario()));
        result.add(obj.getNome());
        result.add(obj.getCPF());
        result.add(obj.getEmail());
        result.add(obj.getTel_celular());
        result.add(obj.getTel_residencial());
        result.add(obj.getCargo());
        result.add(obj.getEnd_rua());
        result.add(obj.getEnd_bairro());
        result.add(obj.getEnd_cep());
        result.add(obj.getEnd_cidade());
        return result;

    }

    private int ultimoCodigo( ) throws SQLException {

        int last = 0;
        objConexao.executeQuery("SELECT MAX(fun_id) FROM tbl_funcionario");
        if (objConexao.resultset.last())
            last = objConexao.resultset.getInt("MAX(fun_id)");
        return last;

    }

  /* public JPanel chamaViewAnimal(){
        return controlPrincipal.chamaAnimal();
    }*/

    public void limpaAtributosFuncionario() throws SQLException, Exception {
        int aux = 0; // so para fazer o operacaoAnimal funcionar direito
        controlPrincipal.operacaoAnimal(aux, Util.LIMPA);
    }


}